include scripts/Makefile
# -C: make 命令的一个选项，表示更改到指定目录再执行 make。
# $(1): 第一个传递给这个命令序列的参数，即要切换到并执行 make 的目录。
modules_make = $(MAKE) -C $(1);
modules_clean = $(MAKE) clean -C $(1);
# 如果不使用.PHONY声明伪目标，Makefile的行为可能会受到当前目录中文件的影响，
# 从而导致构建过程中的意外行为。为了确保Makefile的稳定性和可预测性，建议总是为伪目标使用.PHONY声明。
.PHONY: all mm mc clean
# 如果Makefile中定义了all目标，则make命令默认构建all。
# 这是约定而非顺序决定的。即使不是第一个目标，只要定义了all，它就是默认构建目标。
all: $(Target)

mm:
# foreach 命令在 Makefile 中用于循环处理列表中的元素。
# $(call ...) 后面的逗号是语法的一部分，它用于分隔函数调用的参数。
# 当一个 call 函数有多个参数时，这些参数之间需要用逗号 , 分隔。
	@ $(foreach n,$(Modules),$(call modules_make,$(n)))
mc:
	@ $(foreach n,$(Modules),$(call modules_clean,$(n)))
$(Target) : mm
# 使用$(CC)编译器。
# 加载$(CFLAGS)编译选项。
# 输出文件名为$(Target)。
# 链接所有目标对象文件$(AllObjs)。
# 链接外部库$(Libs)。
	$(CC) $(CFLAGS) -o $(Target) $(AllObjs) $(Libs)
	@ echo $(Target) make done!

clean : mc
	rm -rf $(Target)
	@ echo clean done!